home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1995-11-25 | 3.0 KB | 86 lines |
- IMPLEMENTATION MODULE Sounds;
-
- FROM SYSTEM IMPORT VAL,ADR, SHIFT;
- FROM XBIOS104 IMPORT GIRead,GIWrite,DoSound;
-
- VAR i : CARDINAL;
- (* Kanal 1..3 des Soundchips *)
- PROCEDURE Wave(Kanal,Kurve,Dauer :CARDINAL);
- VAR LowByte : BITSET;
- BEGIN
- IF (Kanal<4) AND (Kanal>0) THEN
- GIWrite (8+Kanal-1,16); (* Lautstärke durch Hüllkurve gesteuert *)
- LowByte:=VAL(BITSET,Dauer)*VAL(BITSET,0FFH);
- GIWrite (13,Kurve);
- GIWrite (11,VAL(CARDINAL,LowByte));
- GIWrite (12,SHIFT(Dauer, - 8));
- END(*IF*);
- END Wave;
-
-
- PROCEDURE Sound(Kanal,Periode:CARDINAL);
- VAR LowByte : BITSET;
- BEGIN
- IF (Kanal<4) AND (Kanal>0) THEN
- LowByte:=VAL(BITSET,Periode)*VAL(BITSET,0FFH);
- GIWrite ((Kanal-1)*2,VAL(CARDINAL,LowByte)); (* Lowbyte *)
- GIWrite ((Kanal-1)*2+1,SHIFT(Periode,- 8)); (* Highbyte *)
- END(*IF*);
- END Sound;
-
-
- PROCEDURE Volume(Kanal,Vol:CARDINAL);
- (* Werte von 0..15 möglich *)
- BEGIN
- IF (Kanal<4) AND (Kanal>0) THEN
- Kanal:=Kanal-1+8;
- GIWrite(Kanal,Vol);
- END(*IF*);
- END Volume;
-
- PROCEDURE Noise(Hoehe:CARDINAL);
- VAR Gesetzt : CARDINAL;
- BEGIN
- GIWrite(6,Hoehe); (* Nur Werte von 0..31 sinnvoll *)
- END Noise;
-
- PROCEDURE SetSoundAndNoise(NoiseChanels,SoundChanels:Chanel);
- (* Mit NoiseChanels bzw SoundChanels wird angegeben *)
- (* welche der Ton- oder Rauschkanäle ausgeschaltet !! *)
- (* werden *)
- (* Zu jedem Tonkanal kann Rauschen dazugemischt werden *)
- VAR KanalFlag :CARDINAL;
- BEGIN
- KanalFlag:=0C0H; (* Bits 6 und 7 müssen gesetzt sein *)
- KanalFlag:=KanalFlag+VAL(CARDINAL,SoundChanels); (* Bits 0,1,2 schalten Oszilatoren ein *)
- KanalFlag:=KanalFlag+SHIFT(VAL(CARDINAL,NoiseChanels),3); (* Bit 3,4,5 gibt an ob ein *)
- (* Rauschkanal dazugemischt wird *)
- GIWrite(7,KanalFlag);
- END SetSoundAndNoise;
-
-
- PROCEDURE SoundAndNoiseOnOff(NoiseFlag,SoundFlag:CARDINAL);
- (* Eigendlich dieselbe PROCEDURE wie SetSoundAndNoise *)
- (* Nur das hier ein CARDINAL anstelle des SETs *)
- (* übergeben wird. *)
- (* KanalFlag := 0 => Kanal 1, 2 u. 3 an *) (*000*)
- (* KanalFlag := 1 => Kanal 1 aus, 2 u. 3 an *) (*001*)
- (* KanalFlag := 2 => Kanal 2 aus, 1 u. 3 an *) (*010*)
- (* KanalFlag := 3 => Kanal 1 u. 2 aus, 3 an *) (*011*)
- (* KanalFlag := 4 => Kanal 3 aus, 1 u. 2 an *) (*100*)
- (* KanalFlag := 5 => Kanal 1 u. 3 aus, 2 an *) (*101*)
- (* KanalFlag := 6 => Kanal 3 u. 2 aus, 1 an *) (*110*)
- (* KanalFlag := 7 => Kanal 1, 2 u. 3 aus *) (*111*)
- VAR KanalFlag :CARDINAL;
- BEGIN
- IF (NoiseFlag<8) AND (SoundFlag<8) THEN (* Nur keinen Unsinn hineinschreiben!*)
- KanalFlag:=0C0H; (* Bits 6 und 7 müssen gesetzt sein *)
- KanalFlag:=KanalFlag+SoundFlag; (* Bits 0,1,2 schalten Oszilatoren ein *)
- KanalFlag:=KanalFlag+SHIFT(NoiseFlag,3); (* Bit 3,4,5 gibt an ob ein *)
- (* Rauschkanal dazugemischt wird *)
- GIWrite(7,KanalFlag);
- END(*IF*);
- END SoundAndNoiseOnOff;
-
- END Sounds.
-